package com.sxf.redis.iredis;

/**
 * 
 * @description: 获取锁的工具类
 * @author: zhangyb@ccccit.com.cn 
 * @date: 2021年1月5日 下午2:22:47
 */
public interface ILockRedisUtils {

	/**
	 * 获取锁，如果该锁被占用将会一直阻塞
	 * @param nameSpace
	 * @param key
	 * @param leaseTimeSeconds 锁的持有时间
	 */
	void lock(String nameSpace, String key, long leaseTimeSeconds);

	/**
	 * 获取锁，如果该锁被占用将会一直阻塞
	 * @param key
	 * @param leaseTimeSeconds
	 */
	default void lock(String key, long leaseTimeSeconds) {
		lock(null, key, leaseTimeSeconds);
	}

	/**
	 * 试着获取锁
	 * @param nameSpace
	 * @param key
	 * @param leaseTimeSeconds 锁的持有时间
	 * @param waitTimeSeconds 获取锁时的等待时间
	 * @return 是否成功获取锁，获取锁返回true，否则返回false
	 */
	boolean tryLock(String nameSpace, String key, long leaseTimeSeconds, long waitTimeSeconds);

	/**
	 * 试着获取锁
	 * @param key
	 * @param leaseTimeSeconds
	 * @param waitTimeSeconds
	 * @return 是否成功获取锁，获取锁返回true，否则返回false
	 */
	default boolean tryLock(String key, long leaseTimeSeconds, long waitTimeSeconds) {
		return tryLock(null, key, leaseTimeSeconds, waitTimeSeconds);
	}

	/**
	 * 判断锁是否被占用
	 * @param nameSpace
	 * @param key
	 * @return
	 */
	boolean isLocked(String nameSpace, String key);

	/**
	 * 判断锁是否被占用
	 * @param key
	 * @return
	 */
	default boolean isLocked(String key) {
		return isLocked(null, key);
	}

	/**
	 * 释放锁
	 * @param nameSpace
	 * @param key
	 */
	void unlock(String nameSpace, String key);

	/**
	 * 释放锁
	 * @param key
	 */
	default void unlock(String key) {
		unlock(null, key);
	}

	/**
	 * 强制释放锁
	 * @param nameSpace
	 * @param key
	 * @return
	 */
	Boolean forceUnlock(String nameSpace, String key);

	/**
	 * 强制释放锁
	 * @param key
	 * @return
	 */
	default Boolean forceUnlock(String key) {
		return forceUnlock(null, key);
	}

}
